#ifndef __CFL_TABLE_H__
#define __CFL_TABLE_H__

#include "cfl_macros.h"

#ifdef __cplusplus
extern "C" {
#endif

#define TABLE_DECLARE(table)                                                                       \
    typedef struct table table;                                                                    \
    void table##_set_table_box(table *self, int val);                                              \
    int table##_table_box(table *self);                                                            \
    void table##_set_rows(table *self, int val);                                                   \
    int table##_rows(table *self);                                                                 \
    void table##_set_cols(table *self, int val);                                                   \
    int table##_cols(table *self);                                                                 \
    void table##_visible_cells(table *self, int *r1, int *r2, int *c1, int *c2);                   \
    int table##_is_interactive_resize(table *self);                                                \
    int table##_row_resize(table *self);                                                           \
    void table##_set_row_resize(table *self, int flag);                                            \
    int table##_col_resize(table *self);                                                           \
    void table##_set_col_resize(table *self, int flag);                                            \
    int table##_col_resize_min(table *self);                                                       \
    void table##_set_col_resize_min(table *self, int val);                                         \
    int table##_row_resize_min(table *self);                                                       \
    void table##_set_row_resize_min(table *self, int val);                                         \
    int table##_row_header(table *self);                                                           \
    void table##_set_row_header(table *self, int flag);                                            \
    int table##_col_header(table *self);                                                           \
    void table##_set_col_header(table *self, int flag);                                            \
    void table##_set_col_header_height(table *self, int height);                                   \
    int table##_col_header_height(table *self);                                                    \
    void table##_set_row_header_width(table *self, int width);                                     \
    int table##_row_header_width(table *self);                                                     \
    void table##_set_row_header_color(table *self, unsigned int val);                              \
    unsigned int table##_row_header_color(table *self);                                            \
    void table##_set_col_header_color(table *self, unsigned int val);                              \
    unsigned int table##_col_header_color(table *self);                                            \
    void table##_set_row_height(table *self, int row, int height);                                 \
    int table##_row_height(table *self, int row);                                                  \
    void table##_set_col_width(table *self, int col, int width);                                   \
    int table##_col_width(table *self, int col);                                                   \
    void table##_set_row_height_all(table *self, int height);                                      \
    void table##_set_col_width_all(table *self, int width);                                        \
    void table##_set_row_position(table *self, int row);                                           \
    void table##_set_col_position(table *self, int col);                                           \
    int table##_row_position(table *self);                                                         \
    int table##_col_position(table *self);                                                         \
    void table##_set_top_row(table *self, int row);                                                \
    int table##_top_row(table *self);                                                              \
    int table##_is_selected(table *self, int r, int c);                                            \
    void table##_get_selection(table *self, int *row_top, int *col_left, int *row_bot,             \
                               int *col_right);                                                    \
    void table##_set_selection(table *self, int row_top, int col_left, int row_bot,                \
                               int col_right);                                                     \
    int table##_move_cursor_with_shiftselect(table *self, int R, int C, int shiftselect);          \
    int table##_move_cursor(table *self, int R, int C);                                            \
    int table##_scrollbar_size(const table *self);                                                 \
    void table##_set_scrollbar_size(table *self, int newSize);                                     \
    void table##_set_tab_cell_nav(table *self, int val);                                           \
    int table##_tab_cell_nav(const table *self);                                                   \
    void table##_draw_cell(table *self,                                                            \
                           void (*)(Fl_Widget *, int, int, int, int, int, int, int, void *),       \
                           void *data);                                                            \
    void *table##_draw_cell_data(const table *self);                                               \
    void table##_set_draw_cell_data(table *self, void *data);                                      \
    int table##_callback_col(table *);                                                             \
    int table##_callback_row(table *);                                                             \
    int table##_callback_context(table *);                                                         \
    void *table##_scrollbar(const table *);                                                        \
    void *table##_hscrollbar(const table *);                                                       \
    int table##_find_cell(const table *self, int ctx, int r, int c, int *x, int *y, int *w,        \
                          int *h);                                                                 \
    int table##_cursor2rowcol(const table *self, int *r, int *c, int *flag);

WIDGET_DECLARE(Fl_Table)

GROUP_DECLARE(Fl_Table)

TABLE_DECLARE(Fl_Table)

WIDGET_DECLARE(Fl_Table_Row)

GROUP_DECLARE(Fl_Table_Row)

TABLE_DECLARE(Fl_Table_Row)

int Fl_Table_Row_row_selected(Fl_Table_Row *self, int row);

int Fl_Table_Row_select_row(Fl_Table_Row *self, int row, int flag);

void Fl_Table_Row_select_all_rows(Fl_Table_Row *self, int flag);

#ifdef __cplusplus
}
#endif
#endif
